from flask import g
from info.models import User, News, Category
from info.utils.response_code import RET
from . import index_bp
from flask import current_app, render_template, jsonify, request, session
from info import models, constants, redis_store
from info.utils.common import login_user_data


@index_bp.route('/news_list')
def get_news_list():
    """获取首页新闻列表数据接口"""
    # 获取数据(cid 分类id   page当前页码(默认展示第一页)  per_page当前也展示多少条数据)
    cid = request.args.get("cid")
    page = request.args.get("page", 1)
    per_page = request.args.get("per_page", constants.HOME_PAGE_MAX_NEWS)

    # 校验参数(1.非空判断)
    if not all([cid, page, per_page]):
        return jsonify(errno=RET.DATAERR, errmsg="参数不足")
    # 2.对数据类型进行校验判断
    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="数据类型错误")

    #  最新的新闻  不需要根据cid来查询只需要根据创建时间来查询
    filters = []
    if cid != 1:
        # 将查询条件添加到filter列表中
        filters.append(News.category_id == cid)

    try:
        # 3.根据上传参数进行数据库分页查询
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询新闻列表数据异常")

    # 当前页码所有数据
    items = paginate.items
#     当前页码
    current_page = paginate.page
#     总页数
    total_page = paginate.pages

#    将数据转换成dict对象给前端使用
    newsList = []
#     遍历item模型列表获取每一个模型进而转换成字典添加在newsList中
    for news in items if items else None:
        newsList.append(news.to_dict())
        # 组织数据
    data = {
        "newsList": newsList,
        "current_page": current_page,
        "tatal_page": total_page
    }

#     组织响应对象
    return jsonify(errno=RET.OK, errmsg="查询新闻list数据成功")


# 使用蓝图对象
@index_bp.route('/')
@login_user_data
def index():
    # ------1.查询用户信息,将用户信息通过模板带回进行展示
    user = g.user
    # 1.如果用户登入成功就能获取用户Id
    # user_id = session.get("user_id")
    # user = None
    # # 2.根据用户Id查询用户所有数据
    # if user_id:
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)

    # -----2.查询新闻的点击排行数据进行展示
    # news_model_list = None
    try:
        news_model_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)

    #     将模型列表转换成字典列表
    news_model_list = []
    for news in news_model_list if news_model_list else []:
        # 将新闻模型对象转换成字典对象添加到news_model_list列表中
        news_model_list.append(news.to_dict())

        # -----2.查询新闻的点击排行数据进行展示
    categories = []
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)

        # 对象模型列表转字典列表
        category_dict_list = []
        for category in categories if categories else []:
            # 将category对像转换成字典添加到列表中
            category_dict_list.append(category.to_dict())

    # 构建响应数据
    data = {
        "user_info": user.to_dict() if user else None,
        "newsClicksList": news_model_list,
        # "categories": category_dict_list
    }

    return render_template("index.html", data=data)

    # # ImportError: cannot import name 'redis_store' 循环导入
    # redis_store.set("name", "laowang")
    # current_app.logger.debug("记录日志")
    # # 没调整前: 数据存在flask后端服务器,只是将session_id 使用cookie的方式给了客户端
    # session["name"] = "curry"
    # # print(current_app.url_map)
    #
    # return render_template("index.html")


# 返回web头像
@index_bp.route('/favicon.ico')
def favicon():
    """返回图标"""
    return current_app.send_static_file("news/favicon.ico")
